package cmd

import (
	"github.com/spf13/cobra"
	"go-programming-tour-book/tour/internal/sql2struct"
	"log"
)

// 指定数据库的账号、密码、HOST、编码、数据库类型、数据库名称及表名称
var (
	username  string //账号
	password  string //密码
	host      string //HOST
	charset   string //编码
	dbType    string //数据库类型
	dbName    string //数据库名称
	tableName string //表名称
)

// 声明了 sql 子命令
var sqlCmd = &cobra.Command{
	Use:   "sql",
	Short: "sql 转换和处理",
	Long:  "sql 转换和处理",
	Run:   func(cmd *cobra.Command, args []string) {},
}

// sql 子命令的子命令 struct
var sql2structCmd = &cobra.Command{
	Use:   "struct",
	Short: "sql 转换",
	Long:  "sql 转换",
	Run: func(cmd *cobra.Command, args []string) { //相当于一个控制器
		dbInfo := &sql2struct.DBInfo{
			DBType:   dbType,
			Host:     host,
			UserName: username,
			Password: password,
			Charset:  charset,
		}
		dbModel := sql2struct.NewDBModel(dbInfo)
		err := dbModel.Connect() //数据库的连接
		if err != nil {
			log.Fatalf("dbModel.Conect err: %v\n", err)
		}
		columns, err := dbModel.GetColumns(dbName, tableName) //数据库查询：查询数据库列表中的东西
		if err != nil {
			log.Fatalf("dbModel.GetColumns err：%v\n", err)
		}

		template := sql2struct.NewStructTemplate()           //创建新的模版对象
		templateColumns := template.AssemblyColumns(columns) //通过查询 COLUMNS 表所组装得到的 tbColumns 进行进一步的分解和转换。
		err = template.Generate(tableName, templateColumns)  // 对模版渲染的自定义函数和模版对象进行处理
		if err != nil {
			log.Fatalf("template.Generate err: %v\n", err)
		}
	},
}

// 默认的 cmd 初始化动作和命令行参数的绑定
func init() {
	sqlCmd.AddCommand(sql2structCmd)
	sql2structCmd.Flags().StringVarP(&username, "username", "", "", "请输入数据库的账号")
	sql2structCmd.Flags().StringVarP(&password, "password", "", "", "请输入数据库的密码")
	sql2structCmd.Flags().StringVarP(&host, "host", "", "127.0.0.1:3306", "请输入数据库的 HOST")
	sql2structCmd.Flags().StringVarP(&charset, "charset", "", "utf8mb4", "请输入数据库的编码")
	sql2structCmd.Flags().StringVarP(&dbType, "type", "", "mysql", "请输入数据库实例类型")
	sql2structCmd.Flags().StringVarP(&dbName, "db", "", "", "请输入数据库名称")
	sql2structCmd.Flags().StringVarP(&tableName, "table", "", "", "请输入表名称")
}
